/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio.Cola;

/**
 *
 * @author Ivan
 */
public class Cola<E extends Comparable> {

    public Nodo<E> raiz;
    private int cant;
    private Nodo<E> ultimo;

    public Cola()
    {
        raiz=null;
        cant = 0;
    }


    public void insertar(E dato)
    {
        if(raiz == null)
        {
            raiz=new Nodo(dato);
            ultimo=raiz;
            cant++;
        }
        else
        {
            Nodo temp=raiz;            
            while(temp.getSiguiente()!=null)
            {
                temp=temp.getSiguiente();
            }
            Nodo nuevo=new Nodo(dato);
            temp.setSiguiente(nuevo);
            ultimo=nuevo;
            cant++;
        }
    }

    public void insertarPrimero(E dato){
        if(raiz != null)
        {
            Nodo temp=new Nodo(dato);
            temp.setSiguiente(temp);
            raiz=temp;            
            cant++;
        }
    }

    public E eliminar() throws Exception
    {
        if(raiz!=null)
        {
            E retorno=raiz.getDatos();
            raiz=raiz.getSiguiente();
            cant--;
            return retorno;
        }
        throw new Exception();
        

    }

    public E eliminarUltimo() throws Exception
    {
        if(raiz==null)
            return null;
        if(raiz!=null)
        {
            Nodo <E> temp=raiz;
            Nodo <E> anterior=null;
            while(temp.getSiguiente()!=null)
            {
                anterior = temp;
                temp=temp.getSiguiente();
            }
            if(anterior==null){
                raiz=null;
                cant--;
                 E retorno = temp.getDatos();
                return retorno;
        
            }
            anterior.setSiguiente(null);
            ultimo=anterior;
            cant--;
            E retorno = temp.getDatos();
            return retorno;
        }
        throw new Exception();
    }

    /**
     * @return the cant
     */
    public int getCant() {
        return cant;
    }

    /**
     * @param cant the cant to set
     */
    public void setCant(int cant) {
        this.cant = cant;
    }
     public boolean estaVacio()
    {
        if(raiz==null)
            return true;
        else
            return false;

    }
     public void insertarOrdenado(E dato)
     {
         Nodo temp=raiz;
         Nodo anterior=null;
         if(raiz==null)
            {
             raiz=new Nodo(dato,temp);
             cant++;
             ultimo=raiz;
             return;
             }
         while(temp!=null)
         {
             if(temp.getDatos().compareTo(dato) < 0)
             {
                 if(anterior==null)
                 {
                     raiz=new Nodo(dato,temp);
                     cant++;
                 }
                     
                 else
                 {
                     Nodo nuevo=new Nodo(dato,temp);
                     anterior.setSiguiente(nuevo);
                     cant++;
                 }
                 return;
             }
             anterior=temp;
             temp=temp.getSiguiente();
         }
        

         Nodo nuevo=new Nodo(dato,temp);
         anterior.setSiguiente(nuevo);
         ultimo=nuevo;
         cant++;


     }

    public Nodo<E> getUltimo() {
        return ultimo;
    }

    public void setUltimo(Nodo<E> ultimo) {
        this.ultimo = ultimo;
    }

    @Override
     public String toString()
     {
         String retorno="";
         Nodo temp=raiz;
         while(temp!=null)
         {
             retorno=retorno + temp.getDatos().toString()+"\n";
             temp=temp.getSiguiente();
         }
         return retorno;
     }

    public void limpiar(){
        raiz=null;
        ultimo=null;
    }
}
